/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import POJO.Nguoidung;
import UTIL.HibernateUtil;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/**
 *
 * @author nhlvu07db373
 */
public class NguoidungDAO extends HibernateDaoSupport {

    private Session session;

    /**
     * Rút trích tất cả người dùng
     * @return Danh sách các sản phẩm kiểu List 
     */
    public List dsNguoidungAll() {
        List list = null;
        session = HibernateUtil.getSessionFactory().openSession();
        try {
            org.hibernate.Transaction ts = session.beginTransaction();
            Criteria crit = session.createCriteria(Nguoidung.class);
            list = crit.list();
            ts.commit();
            session.flush();
        } catch (Exception ex) {
            System.err.println(ex.getMessage().toString());
        } finally {
            session.close();
        }
        return list;
    }

    /**
     * Rút trích tất cả các người dùng bao gồm đã xóa có phân trang
     * @param firstResult dòng đầu tiên cần lấy
     * @param maxResults số dòng cần lấy tối đa
     * @return trả ra kết quả các record thỏa
     * @throws Throwable 
     */
    public List dsNguoidungAll(int firstResult, int maxResults) throws Throwable {
        List list = null;
        session = HibernateUtil.getSessionFactory().openSession();
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            org.hibernate.Transaction ts = session.beginTransaction();
            Criteria crit = session.createCriteria(Nguoidung.class);
            crit.setFirstResult(firstResult);
            crit.setMaxResults(maxResults);
            list = crit.list();
            ts.commit();
            session.flush();
        } catch (Exception ex) {
            System.err.println(ex.getMessage().toString());
        } finally {
            session.close();
        }
        return list;
    }

    /**
     * Lấy danh sách các sản phẩm theo tình trạng
     * @param tinhTrang tình trạng của sản phẩm 0 ngưng bán 1 đang bán
     * @return List các sản phẩm thỏa
     */
    public List dsSanphamFi(int tinhTrang) {
        List list = null;
        session = HibernateUtil.getSessionFactory().openSession();
        try {
            org.hibernate.Transaction ts = session.beginTransaction();
            Criteria crit = session.createCriteria(Nguoidung.class).add(Restrictions.eq("tinhTrang", tinhTrang));
            list = crit.list();
            ts.commit();
            session.flush();
        } catch (Exception ex) {
            System.err.println(ex.getMessage().toString());
        } finally {
            session.close();
        }
        return list;
    }

    /**
     * Rút trích tất cả các sản phẩm hiện tại theo tình trạng có phân trang
     * @param tinhTrang tình trạng của sản phẩm 0 hết bán 1 là đang bán
     * @param firstResult dòng đầu tiên cần lấy
     * @param maxResults số dòng cần lấy tối đa
     * @return trả ra kết quả các record thỏa
     * @throws Throwable 
     */
    public List dsSanphamFi(int tinhTrang, int firstResult, int maxResults) throws Throwable {
        List list = null;
        session = HibernateUtil.getSessionFactory().openSession();
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            org.hibernate.Transaction ts = session.beginTransaction();
            Criteria crit = session.createCriteria(Nguoidung.class).add(Restrictions.eq("tinhTrang", tinhTrang));
            crit.setFirstResult(firstResult);
            crit.setMaxResults(maxResults);
            list = crit.list();
            ts.commit();
            session.flush();
        } catch (Exception ex) {
            System.err.println(ex.getMessage().toString());
        } finally {
            session.close();
        }
        return list;
    }

    /**
     * Lấy thông tin người dùng dựa vào mã người dùng
     * @param maSp tham số truyền vào là mã sản phẩm kiểu string
     * @return là sản phẩm có cùng mã nếu có Sanpham POJO
     */
    public Nguoidung layNguoiDung(String maNd) {
        Nguoidung nd = null;
        session = HibernateUtil.getSessionFactory().openSession();
        try {
            org.hibernate.Transaction ts = session.beginTransaction();
            Criteria crit = session.createCriteria(Nguoidung.class).add(Restrictions.like("maNguoiDung", maNd));
            List list = crit.list();
            nd = (Nguoidung) list.get(0);
            ts.commit();
            session.flush();
        } catch (Exception ex) {
            System.err.println(ex.getMessage().toString());
        } finally {
            session.close();
        }
        return nd;
    }

    /**
     * Cập nhật thông tin hay tiếp nhận một người dùng mới
     * @param sp Sản phẩm POJO cần xử lí
     * @return trả ra kết quả true nếu xử lí thành công và ngược lại
     */
    public boolean luuNguoidung(Nguoidung nd) {
        boolean kq = false;
        if (nd.getMaNguoiDung().equals("")) {
            String maSp = new GetIDDAO().getID("ND", "nguoidung", "MaNguoiDung");
            nd.setMaNguoiDung(maSp);
        }
        session = HibernateUtil.getSessionFactory().openSession();
        try {
            org.hibernate.Transaction ts = session.beginTransaction();
            session.saveOrUpdate(nd);
            ts.commit();
            session.flush();
            kq = true;
        } catch (Exception ex) {
            if (session.getTransaction().isActive()) {
                session.getTransaction().rollback();
            }
            System.err.println(ex.getMessage().toString());
        } finally {
            session.close();
        }
        return kq;
    }

    /**
     * Xóa một sản phẩm
     * @param sp tham số truyền vào là Sản phẩm POJO cần xóa
     * @return kết quả là true nếu xóa thành công
     */
    public boolean xoaNguoidung(Nguoidung nd) {
        session = HibernateUtil.getSessionFactory().openSession();
        boolean kq = false;
        try {
            org.hibernate.Transaction ts = session.beginTransaction();
            session.delete(nd);
            ts.commit();
            session.flush();
            kq = true;
        } catch (Exception ex) {
            if (session.getTransaction().isActive()) {
                session.getTransaction().rollback();
            }
            System.err.println(ex.getMessage().toString());
        } finally {
            session.close();
        }
        return kq;
    }

    /**
     * Cập nhật tình trạng cho người dùng
     * @param maNd mã người dùng
     * @param tinhTrang mã tình trạng
     * @return 
     */
    public boolean capnhattinhtrangNguoidung(String maNd, int tinhTrang) {
        Nguoidung nd=layNguoiDung(maNd);
        nd.setTinhTrang(tinhTrang);
        return luuNguoidung(nd);
    } 
    /**
     * Kiểm tra đăng nhập của người dùng
     * @param email
     * @param matKhau
     * @return 
     */
    public Nguoidung dangNhap(String email, String matKhau){
        Nguoidung nd =null;
        session = HibernateUtil.getSessionFactory().openSession();
        try {
            org.hibernate.Transaction ts = session.beginTransaction();
            Criteria crit = session.createCriteria(Nguoidung.class).add(Restrictions.and(
                    Restrictions.like("email", email), Restrictions.like("matKhau", matKhau)));
            List list = crit.list();
            nd = (Nguoidung) list.get(0);
            if(nd!=null){
               if(new BannickDAO().kiemtranguoidung(nd.getMaNguoiDung())){
                   nd=null;
               }
            }
            ts.commit();
            session.flush();
        } catch (Exception ex) {
            System.err.println(ex.getMessage().toString());
        } finally {
            session.close();
        }
        return nd;       
    }
   }
